<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="/static/layui/css/layui.css">
    {% block css %}
    {% endblock %}
</head>
<body>
<div class="modal" id="modal">
    <div class="modal-body">
        <div class="modal-header">
            <h3>警告</h3>
            <button class="modal-close">&times;</button>
        </div>
        <hr>
        <p id="alert-message">这是一个警告信息！</p>
    </div>
</div>
{% csrf_token %}
<div class="layui-layout layui-layout-admin">
    <div class="layui-header">
        <div class="layui-logo layui-hide-xs layui-bg-black">RBAC用户管理平台</div>
        <!-- 头部区域（可配合layui 已有的水平导航） -->

        <ul class="layui-nav layui-layout-right">
            <li class="layui-nav-item"><a href="{% url 'auth:logout' %}">注销</a></li>
        </ul>
    </div>
    <div class="layui-side layui-bg-black">
        <div class="layui-side-scroll">
            <ul class="layui-nav layui-nav-tree" lay-filter="left-bar" id="left-bar">
            </ul>
        </div>
    </div>

    <div class="layui-body" style="padding: 10px;">
        <!-- 内容主体区域 -->
        {% block body %}

        {% endblock %}
    </div>

    <div class="layui-footer">
        <!-- 底部固定区域 -->
        底部固定区域
    </div>
</div>
<script src="/static/js/jquery.min.js"></script>
<script src="/static/layui/layui.js"></script>
<script src="/static/layui/xm-select.js"></script>
<script>
    layui.use(['jquery', 'element'], function () {
        const $ = layui.jquery;
        const element = layui.element;
        const menuContainer = document.getElementById("left-bar");

        // 监听左侧菜单的点击事件
        element.on('nav(left-bar)', function (elem) {
            // 判断是否有子菜单
            console.log(elem)
            // .siblings('dl.layui-nav-child') 是一个 jQuery 方法，用于选择 elem 的同级元素中符合选择器条件 'dl.layui-nav-child' 的元素。它会选择所有与 elem 相邻的兄弟元素中具有 dl 标签和 layui-nav-child 类的元素。
            if (elem.siblings('dl.layui-nav-child').length > 0) {
                // .toggle() 是一个 jQuery 方法，用于在选中的元素上切换显示和隐藏的状态。如果元素当前是隐藏的，则调用该方法会显示元素；如果元素当前是显示的，则调用该方法会隐藏元素。
                elem.siblings('dl.layui-nav-child').toggle();
                // layui 重新渲染菜单，以保持展开状态
                element.render('nav', 'left-bar');
            }
        });
        // 获取url 自动选择菜单栏
        window.onload = function () {
            //获取当前页面的路径（URL）。
            url = window.location.pathname;
            // 使用 jQuery 选择器，选取具有 href 属性值等于 url 的 <a> 元素，并将其存储在 labelA 变量中。
            const labelA = $("a[href='" + url + "']")
            // 给 labelA 的父元素添加一个名为 'layui-this' 的 CSS 类，这通常用于指示当前选中或激活的菜单项。
            labelA.parent().addClass('layui-this');
            //  给 labelA 的祖父元素（父元素的父元素的父元素）添加一个名为 'layui-nav-itemed' 的 CSS 类，这通常用于指示包含子菜单的菜单项处于展开状态。
            labelA.parent().parent().parent().addClass('layui-nav-itemed');
            //  设置 labelA 的父元素（即包含子菜单的元素）的 display 样式为 "block"，以确保子菜单可见。
            labelA.parent().parent().css("display", "block");
        }

         // 生成菜单函数
        function generateMenu(data, container) {
            var menuGroups = {};

            // 根据 parent_id 分组
            for (var i = 0; i < data.length; i++) {
                var item = data[i];
                if (!menuGroups[item.parent_id]) {
                    menuGroups[item.parent_id] = [];
                }
                menuGroups[item.parent_id].push(item);
            }

            for (var i = 0; i < data.length; i++) {
                var item = data[i];
                if (item.parent_id === null) {
                    var li = document.createElement('li');
                    li.classList.add('layui-nav-item');
                    li.classList.add('layui-nav-itemed');

                    var a = document.createElement('a');
                    a.href = item.url || 'javascript:;';
                    a.innerText = item.name;

                    li.appendChild(a);

                    var childMenu = menuGroups[item.id];
                    if (childMenu && childMenu.length > 0) {
                        var dl = document.createElement('dl');
                        dl.classList.add('layui-nav-child');
                        dl.style.display='none';
                        generateSubMenu(childMenu, dl, menuGroups);

                        li.appendChild(dl);
                    }

                    container.appendChild(li);
                }
            }

            element.render('nav', 'left-bar');
        }

        // 递归生成子菜单
        function generateSubMenu(subMenu, parent, menuGroups) {
            for (var i = 0; i < subMenu.length; i++) {
                var item = subMenu[i];
                var dd = document.createElement('dd');

                var childA = document.createElement('a');
                childA.href = item.url || 'javascript:;';
                childA.innerText = item.name;

                dd.appendChild(childA);
                parent.appendChild(dd);

                var grandChildMenu = menuGroups[item.id];
                if (grandChildMenu && grandChildMenu.length > 0) {
                    var innerDl = document.createElement('dl');
                    innerDl.classList.add('layui-nav-child');

                    generateSubMenu(grandChildMenu, innerDl, menuGroups);

                    dd.appendChild(innerDl);
                }
            }
        }
        $.ajax({
            type: "GET",
            url: '{% url "auth:menu" %}',
            async: false,
            dataType: 'json',
            success: function (res) {
                if (res.code === 0) {
                    const menuData = res.menu;
                    // 根据sort 字段对菜单做排序处理
                    menuData.sort(function (a, b) {
                        var sortA = parseFloat(a.sort);
                        var sortB = parseFloat(b.sort);
                        if (sortA < sortB) {
                            return -1;
                        }
                        if (sortA > sortB) {
                            return 1;
                        }
                        return 0;
                    });
                    generateMenu(menuData, menuContainer);
                } else {
                    layer.msg(res.msg, {icon: 5});
                }
            }, error: function (res) {
                layer.msg(res.msg, {icon: 5});
            }
        });
    });

</script>
{% block js %}

{% endblock %}
</body>
</html>
